package com.wang.weather.common;

import com.wang.weather.Utils.HttpUtils;
import com.wang.weather.Utils.ResData;
import org.apache.http.HttpResponse;
import org.apache.http.util.EntityUtils;
import org.springframework.stereotype.Component;

import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Map;


@Component
public class WeatherQuery {

    /**
     * 根据城市名称获取天气信息
     * 该方法通过调用阿里云API市场提供的天气查询接口，获取指定城市的天气数据
     *
     * @param cityName 城市名称，用于查询天气信息
     * @return 返回一个ResData对象，包含查询到的天气信息如果查询失败，返回ResData.err()
     */
    public ResData getWeather(String cityName){
        // 定义API的基础URL、路径、请求方法和应用码
        String host = "https://jisutqybmf.market.alicloudapi.com";
        String path = "/weather/query";
        String method = "GET";//GET/POST 任意
        String appcode = "5ff055d17e614f20a057acd9ecdba9e7";

        // 初始化请求头，包含授权信息和内容类型
        Map<String, String> headers = new HashMap<String, String>();
        //最后在header中的格式(中间是英文空格)为Authorization:APPCODE 83359fd73fe94948385f570e3c139105
        headers.put("Authorization", "APPCODE " + appcode);
        //根据API的要求，定义相对应的Content-Type
        headers.put("Content-Type", "application/json; charset=UTF-8");

        // 初始化查询参数，根据API文档，城市名称是必须的参数
        Map<String, String> querys = new HashMap<String, String>();
        querys.put("city", cityName);
    /*querys.put("citycode", "citycode");
    querys.put("cityid", "cityid");
    querys.put("ip", "ip");
    querys.put("location", "location");*/

        try {
            // 发起HTTP GET请求获取天气信息
            HttpResponse response = HttpUtils.doGet(host, path, method, headers, querys);

            // 打印响应信息，用于调试和验证
            System.out.println(response.toString());
        /*System.out.println(response.toString());
        获取response的body
        System.out.println(EntityUtils.toString(response.getEntity(),"utf-8"));*/

            // 将返回的json数据封装到List中
            List<Object> entity = Collections.singletonList(EntityUtils.toString(response.getEntity(), "utf-8"));

            // 打印实体内容，用于调试和验证
            entity.forEach(System.out::println);

            // 返回包含天气信息的成功响应
            return ResData.ok(entity);
        } catch (Exception e) {
            // 异常情况下，打印错误信息并返回错误响应
            e.printStackTrace();
            return ResData.err();
        }
    }

}
